package com.leng.common.domain;

import com.leng.common.constant.HttpStatus;
import com.leng.common.constant.SystemConstant;
import lombok.Data;

import java.util.HashMap;

/**
 * <p>
 * 通用返回对象
 * </p>
 *
 * @author ljk
 * @since 2021-12-26 21:12
 */
@Data
public class Result<T> extends HashMap<String, T> {
    /** 默认大小 */
    static final int DEFAULT_SIZE = 5;
    /** 编码 */
    private int code;
    /** 信息 */
    private String msg;
    /** 数据 */
    private T data;

    /**
     * 通用返回对象
     *
     * @param code 编码
     * @param msg  信息
     * @param data 数据
     */
    public Result(int code, String msg, T data) {
        super(DEFAULT_SIZE);
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static <T> Result<T> success() {
        return Result.success(SystemConstant.MSG_SUCCESS);
    }

    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public static <T> Result<T> success(T data) {
        return Result.success(SystemConstant.MSG_SUCCESS, data);
    }

    /**
     * 返回成功消息
     *
     * @param msg 返回内容
     * @return 成功消息
     */
    public static <T> Result<T> success(String msg) {
        return Result.success(msg, null);
    }

    /**
     * 返回成功消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static <T> Result<T> success(String msg, T data) {
        return new Result<>(HttpStatus.SUCCESS, msg, data);
    }

    /**
     * 返回错误消息
     *
     * @return 警告消息
     */
    public static <T> Result<T> error() {
        return Result.error(SystemConstant.MSG_ERROR);
    }

    /**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static <T> Result<T> error(String msg) {
        return Result.error(msg, null);
    }

    /**
     * 返回错误消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static <T> Result<T> error(String msg, T data) {
        return new Result<>(HttpStatus.ERROR, msg, data);
    }

    /**
     * 返回错误消息
     *
     * @param code 状态码
     * @param msg  返回内容
     * @return 警告消息
     */
    public static <T> Result<T> error(int code, String msg) {
        return new Result<>(code, msg, null);
    }

    /**
     * 方便链式调用
     *
     * @param key   键
     * @param value 值
     * @return 数据对象
     */
    public Result<T> puts(String key, T value) {
        super.put(key, value);
        return this;
    }
}
